﻿2026-05-13T12:59:47.8199346Z ##[group]Run pnpm verify:phase-4
2026-05-13T12:59:47.8199697Z [36;1mpnpm verify:phase-4[0m
2026-05-13T12:59:47.8222593Z shell: /usr/bin/bash -e {0}
2026-05-13T12:59:47.8222956Z env:
2026-05-13T12:59:47.8223218Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-13T12:59:47.8223541Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-13T12:59:47.8223775Z   SKIP_TRACE_CHECK: 1
2026-05-13T12:59:47.8223996Z ##[endgroup]
2026-05-13T12:59:48.1288162Z 
2026-05-13T12:59:48.1289429Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-13T12:59:48.1290443Z > node scripts/verify-phase-4.mjs
2026-05-13T12:59:48.1290933Z 
2026-05-13T12:59:48.1616677Z 
2026-05-13T12:59:48.1617740Z === Workspace: typecheck ===
2026-05-13T12:59:48.1618454Z >>> pnpm -r typecheck
2026-05-13T12:59:48.4861156Z Scope: 5 of 6 workspace projects
2026-05-13T12:59:48.4915831Z packages/db typecheck$ tsc --noEmit
2026-05-13T12:59:48.4924392Z packages/game-logic typecheck$ tsc --noEmit
2026-05-13T12:59:51.1274722Z packages/game-logic typecheck: Done
2026-05-13T12:59:51.1454616Z packages/protocol typecheck$ tsc --noEmit
2026-05-13T12:59:53.3355789Z packages/db typecheck: Done
2026-05-13T12:59:54.6527894Z packages/protocol typecheck: Done
2026-05-13T12:59:54.6535385Z apps/server typecheck$ tsc --noEmit
2026-05-13T12:59:54.6538333Z apps/client typecheck$ tsc --noEmit
2026-05-13T13:00:05.9403796Z apps/client typecheck: Done
2026-05-13T13:00:07.1971965Z apps/server typecheck: Done
2026-05-13T13:00:07.2086411Z 
2026-05-13T13:00:07.2087226Z === Lint: protocol-sync ===
2026-05-13T13:00:07.2088163Z >>> pnpm lint:protocol-sync
2026-05-13T13:00:07.5066181Z 
2026-05-13T13:00:07.5067275Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-13T13:00:07.5068378Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-13T13:00:07.5068986Z 
2026-05-13T13:00:07.5383098Z lint-protocol-sync: OK
2026-05-13T13:00:07.5525183Z 
2026-05-13T13:00:07.5526054Z === Lint: game-logic-purity ===
2026-05-13T13:00:07.5526868Z >>> pnpm lint:game-logic-purity
2026-05-13T13:00:07.8477585Z 
2026-05-13T13:00:07.8478718Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-13T13:00:07.8479858Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-13T13:00:07.8480511Z 
2026-05-13T13:00:07.8807715Z lint-game-logic-purity: OK (7 file(s) clean)
2026-05-13T13:00:07.8938647Z 
2026-05-13T13:00:07.8939622Z === Lint: better-auth-schema-sync ===
2026-05-13T13:00:07.8940497Z >>> pnpm lint:better-auth-schema-sync
2026-05-13T13:00:08.1948729Z 
2026-05-13T13:00:08.1950086Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-13T13:00:08.1951384Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-13T13:00:08.1952000Z 
2026-05-13T13:00:09.8620050Z lint-better-auth-schema-sync: OK
2026-05-13T13:00:09.8771750Z 
2026-05-13T13:00:09.8773018Z === Lint: rate-limit-budgets ===
2026-05-13T13:00:09.8773663Z >>> pnpm lint:rate-limit-budgets
2026-05-13T13:00:10.1795548Z 
2026-05-13T13:00:10.1796702Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-13T13:00:10.1797751Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-13T13:00:10.1798235Z 
2026-05-13T13:00:10.2118555Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-13T13:00:10.2254757Z 
2026-05-13T13:00:10.2256438Z === Lint: no-clipboard-rce ===
2026-05-13T13:00:10.2257370Z >>> pnpm lint:no-clipboard-rce
2026-05-13T13:00:10.5234941Z 
2026-05-13T13:00:10.5239594Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-13T13:00:10.5240985Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-13T13:00:10.5241610Z 
2026-05-13T13:00:10.5597179Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-13T13:00:10.5737893Z 
2026-05-13T13:00:10.5738703Z === Lint: room-layout ===
2026-05-13T13:00:10.5739772Z >>> pnpm lint:room-layout
2026-05-13T13:00:10.8694689Z 
2026-05-13T13:00:10.8695984Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-13T13:00:10.8724754Z > node tools/scripts/lint-room-layout.mjs
2026-05-13T13:00:10.8725526Z 
2026-05-13T13:00:10.9094242Z lint-room-layout: OK
2026-05-13T13:00:10.9228168Z 
2026-05-13T13:00:10.9228982Z === ADR 0004 lint ===
2026-05-13T13:00:10.9231229Z >>> pnpm lint:adr:0004
2026-05-13T13:00:11.2205178Z 
2026-05-13T13:00:11.2206179Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-13T13:00:11.2234155Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-13T13:00:11.2236924Z 
2026-05-13T13:00:11.2519449Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-13T13:00:11.2652205Z 
2026-05-13T13:00:11.2653930Z === Drizzle: emit-check ===
2026-05-13T13:00:11.2655097Z >>> pnpm db:emit-check
2026-05-13T13:00:11.5629178Z 
2026-05-13T13:00:11.5629983Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-13T13:00:11.5634489Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-13T13:00:11.5636159Z 
2026-05-13T13:00:12.0098903Z No config path provided, using default 'drizzle.config.ts'
2026-05-13T13:00:12.0102313Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-13T13:00:12.4718556Z 8 tables
2026-05-13T13:00:12.4722190Z accounts 8 columns 1 indexes 0 fks
2026-05-13T13:00:12.4723239Z audit_log 6 columns 0 indexes 2 fks
2026-05-13T13:00:12.4723941Z characters 9 columns 0 indexes 1 fks
2026-05-13T13:00:12.4724699Z inventory_items 4 columns 0 indexes 1 fks
2026-05-13T13:00:12.4725540Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-13T13:00:12.4726344Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-13T13:00:12.4727183Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-13T13:00:12.4727946Z sessions 5 columns 0 indexes 1 fks
2026-05-13T13:00:12.4728455Z 
2026-05-13T13:00:12.4729309Z No schema changes, nothing to migrate 😴
2026-05-13T13:00:13.2131905Z 
2026-05-13T13:00:13.2144498Z === Drizzle: schema-sync ===
2026-05-13T13:00:13.2145226Z >>> pnpm lint:schema-sync
2026-05-13T13:00:13.5161065Z 
2026-05-13T13:00:13.5162216Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-13T13:00:13.5166229Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-13T13:00:13.5169014Z 
2026-05-13T13:00:13.5469733Z OK
2026-05-13T13:00:13.5680725Z 
2026-05-13T13:00:13.5681746Z === Drizzle: source-comments ===
2026-05-13T13:00:13.5682809Z >>> pnpm lint:source-comments
2026-05-13T13:00:13.8820824Z 
2026-05-13T13:00:13.8822035Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-13T13:00:13.8823671Z > pnpm -C packages/db run lint:source-comments
2026-05-13T13:00:13.8824287Z 
2026-05-13T13:00:14.1841127Z 
2026-05-13T13:00:14.1842603Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-13T13:00:14.1843789Z > node scripts/check-source-comments.mjs
2026-05-13T13:00:14.1844404Z 
2026-05-13T13:00:14.2213548Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-13T13:00:14.2473469Z 
2026-05-13T13:00:14.2478308Z === Workspace: test ===
2026-05-13T13:00:14.2482968Z >>> pnpm -r test
2026-05-13T13:00:14.5475642Z Scope: 5 of 6 workspace projects
2026-05-13T13:00:14.5528808Z packages/db test$ vitest run
2026-05-13T13:00:14.5537354Z packages/game-logic test$ vitest run
2026-05-13T13:00:15.0474705Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-13T13:00:15.0542933Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-13T13:00:15.4835815Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-13T13:00:15.7139030Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:00:15.9312727Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T13:00:16.0935067Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T13:00:16.1861257Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:00:16.3364924Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:00:16.4064818Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:00:16.6446984Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-13T13:00:16.8671959Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:00:17.0907878Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:00:17.1354680Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-13T13:00:17.1413891Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-13T13:00:17.1443770Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-13T13:00:17.1462586Z packages/db test: [2m   Start at [22m 13:00:15
2026-05-13T13:00:17.1523979Z packages/db test: [2m   Duration [22m 2.08s[2m (transform 194ms, setup 0ms, import 1.44s, tests 26ms, environment 0ms)[22m
2026-05-13T13:00:17.1854686Z packages/db test: Done
2026-05-13T13:00:17.1873536Z packages/protocol test$ vitest run
2026-05-13T13:00:17.3052713Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:00:17.5411321Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T13:00:17.5594566Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-13T13:00:17.5613757Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-13T13:00:17.5615098Z packages/game-logic test: [2m   Start at [22m 13:00:15
2026-05-13T13:00:17.5634011Z packages/game-logic test: [2m   Duration [22m 2.48s[2m (transform 250ms, setup 0ms, import 477ms, tests 83ms, environment 1ms)[22m
2026-05-13T13:00:17.6188274Z packages/game-logic test: Done
2026-05-13T13:00:17.6911548Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-13T13:00:17.9814818Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-13T13:00:18.1447299Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:00:18.3173799Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:00:18.4721369Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T13:00:18.4779904Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-13T13:00:18.4800663Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-13T13:00:18.4802177Z packages/protocol test: [2m   Start at [22m 13:00:17
2026-05-13T13:00:18.4803746Z packages/protocol test: [2m   Duration [22m 778ms[2m (transform 107ms, setup 0ms, import 225ms, tests 30ms, environment 0ms)[22m
2026-05-13T13:00:18.5101633Z packages/protocol test: Done
2026-05-13T13:00:18.5106638Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-13T13:00:18.5109172Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-13T13:00:19.0501075Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-13T13:00:19.0859701Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-13T13:00:20.1125399Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 61[2mms[22m[39m
2026-05-13T13:00:20.4688381Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T13:00:20.8444806Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-13T13:00:21.0912027Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-13T13:00:21.0934658Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-13T13:00:21.1440667Z apps/server test: {"level":40,"time":1778677221142,"pid":3320,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T13:00:21.1496080Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T13:00:21.1564055Z apps/server test: {"level":40,"time":1778677221145,"pid":3320,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T13:00:21.1584335Z apps/server test: {"level":40,"time":1778677221146,"pid":3320,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T13:00:21.1746936Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 264[2mms[22m[39m
2026-05-13T13:00:22.0686494Z apps/server test: {"level":30,"time":1778677222054,"pid":3331,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-13T13:00:22.0691611Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 689[2mms[22m[39m
2026-05-13T13:00:22.0694542Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 596[2mms[22m[39m
2026-05-13T13:00:22.3553900Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T13:00:22.9628101Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-13T13:00:22.9643696Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-nmyaCX/rebno.db
2026-05-13T13:00:22.9653728Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T13:00:22.9655106Z apps/server test: [run-migrations] OK
2026-05-13T13:00:22.9764788Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-13T13:00:22.9767880Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-elZBNc/rebno.db
2026-05-13T13:00:22.9804062Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T13:00:22.9824014Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-13T13:00:23.0014459Z apps/server test: [run-migrations] OK
2026-05-13T13:00:23.0024493Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-13T13:00:23.0265207Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-ljSBfd/rebno.db
2026-05-13T13:00:23.0267127Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T13:00:23.0464549Z apps/server test: [run-migrations] OK
2026-05-13T13:00:23.0484588Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-13T13:00:23.0527670Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-ljSBfd/rebno.db
2026-05-13T13:00:23.0531298Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T13:00:23.0532222Z apps/server test: [run-migrations] OK
2026-05-13T13:00:23.0533826Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 50[2mms[22m[39m
2026-05-13T13:00:23.3096050Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-13T13:00:23.4759390Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T13:00:23.5465393Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-13T13:00:23.8588308Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-13T13:00:24.1008984Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:00:24.6290043Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 55[2mms[22m[39m
2026-05-13T13:00:25.0296579Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-13T13:00:25.0298519Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ◈ secrets for agents [www.dotenvx.com]
2026-05-13T13:00:25.0333854Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-13T13:00:25.7420509Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:00:25.7469614Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-13T13:00:25.7495367Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-13T13:00:25.7512696Z apps/server test: [2m   Start at [22m 13:00:19
2026-05-13T13:00:25.7534005Z apps/server test: [2m   Duration [22m 6.68s[2m (transform 526ms, setup 0ms, import 3.44s, tests 916ms, environment 2ms)[22m
2026-05-13T13:00:25.7980914Z apps/server test: Done
2026-05-13T13:00:25.8518120Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-13T13:00:26.5481500Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T13:00:27.3097616Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 70[2mms[22m[39m
2026-05-13T13:00:28.0880958Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 87[2mms[22m[39m
2026-05-13T13:00:28.8008980Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-13T13:00:29.5073241Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T13:00:30.2621856Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 81[2mms[22m[39m
2026-05-13T13:00:31.0312847Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 86[2mms[22m[39m
2026-05-13T13:00:31.7196242Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:00:32.4753555Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 74[2mms[22m[39m
2026-05-13T13:00:33.1709573Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:00:33.8662360Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:00:34.5360092Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T13:00:35.2298059Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-13T13:00:35.9133501Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:00:36.5918485Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:00:37.2715565Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:00:37.9492735Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-13T13:00:38.6210327Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:00:39.3228624Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:00:40.0175812Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T13:00:40.0414421Z apps/client test: [2m Test Files [22m [1m[32m25 passed[39m[22m[90m (25)[39m
2026-05-13T13:00:40.0433064Z apps/client test: [2m      Tests [22m [1m[32m188 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (192)[39m
2026-05-13T13:00:40.0434406Z apps/client test: [2m   Start at [22m 13:00:19
2026-05-13T13:00:40.0447302Z apps/client test: [2m   Duration [22m 20.95s[2m (transform 816ms, setup 60ms, collect 1.34s, tests 885ms, environment 12.21s, prepare 2.35s)[22m
2026-05-13T13:00:40.1918300Z apps/client test: Done
2026-05-13T13:00:40.2013297Z 
2026-05-13T13:00:40.2013901Z verify-phase-4: OK (12 steps green)
